package logic;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;


public class Juego {
	private Tablero t;
	private List<Jugador> jugadores;
	private int turno;
	private int valor;
	private int dificultad;
	private Random rd = new Random();
	
	public Juego (){
		this.t = new Tablero();
		this.jugadores = new LinkedList<Jugador>();
		this.jugadores.add(new Jugador(-1, 0));
		this.jugadores.add(new Jugador(1, 1));
		this.turno=rd.nextInt(2);
		this.valor=0;
		this.dificultad=5; //Normal
	}
	

	public Juego(Tablero t, List<Jugador> jugadores, int turno) {
		super();
		this.t = t;
		this.jugadores = jugadores;
		this.turno = turno;
	}


	public int getDificultad() {
		return dificultad;
	}


	public void setDificultad(int dificultad) {
		this.dificultad = dificultad;
	}


	public Tablero getT() {
		return t;
	}

	public void setT(Tablero t) {
		this.t = t;
	}

	public List<Jugador> getJugadores() {
		return jugadores;
	}

	public void setJugadores(List<Jugador> jugadores) {
		this.jugadores = jugadores;
	}

	public int getTurno() {
		return turno;
	}

	public void setTurno(int turno) {
		this.turno = turno;
	}

	public int getValor() {
		return valor;
	}

	public void setValor(int valor) {
		this.valor = valor;
	}
	
	public Juego copy(){
		Juego game=new Juego();
		List<Jugador> j=new LinkedList<Jugador>();
		j.add(new Jugador(jugadores.get(0).getPieza(),jugadores.get(0).getId()));
		j.add(new Jugador(jugadores.get(1).getPieza(),jugadores.get(1).getId()));
		game.setJugadores(j);
		game.setValor(getValor());
		game.setTurno(getTurno());
		game.setT(new Tablero());
		getT().copiarTablero(game.getT());
		return game;
	}
	
	public void undo(Memento m){
		List<Jugador> j=new LinkedList<Jugador>();
		j.add(new Jugador(m.getGame().getJugadores().get(0).getPieza(),m.getGame().getJugadores().get(0).getId()));
		j.add(new Jugador(m.getGame().getJugadores().get(1).getPieza(),m.getGame().getJugadores().get(1).getId()));
		this.setJugadores(j);
		this.setValor(m.getGame().getValor());
		this.setTurno(m.getGame().getTurno());
		this.setT(new Tablero());
		m.getGame().getT().copiarTablero(this.getT());
	}
	
	public int piezasColocadas(){
		return t.piezasColocadas();
	}
	
	public int getPiezaFrom(int p){
		int x=p%3, y=p/3;
		return t.getCasilla(x, y);
	}
	
	public void setPiezaIn(int p, int v){
		int x=p%3, y=p/3;
		t.setCasilla(x, y, v);
	}
	
	public void cambiaTurno(){
		setTurno((getTurno()+1)%2);
		System.out.println("--------------------------Turno: " + turno);
	}
	
	public Jugador getJugadorConTurno(){
		return jugadores.get(getTurno());
	}
	
	public Accion getAccionJugador(){
		return jugadores.get(getTurno()).jugada(copy(), getDificultad());
	}
	
	public boolean juegoTerminado(){
		boolean b = false;
		Tablero t = getT();
		int pieza;
		for (int i=0;i<3 && !b;i++)
			for (int k=0;k<3 && !b;k++){
				pieza=t.getCasilla(i, k);
				if (pieza!=0 && t.getCasilla(i, k)==pieza){
					if ((t.getCasilla(i+1, k)==pieza && t.getCasilla(i-1, k)==pieza)
						|| (t.getCasilla(i+1, k)==pieza && t.getCasilla(i+2, k)==pieza)
						|| (t.getCasilla(i-1, k)==pieza && t.getCasilla(i-2, k)==pieza)	
						|| (t.getCasilla(i, k+1)==pieza && t.getCasilla(i, k-1)==pieza)
						|| (t.getCasilla(i, k+1)==pieza && t.getCasilla(i, k+2)==pieza)
						|| (t.getCasilla(i, k-1)==pieza && t.getCasilla(i, k-2)==pieza)
						|| (t.getCasilla(i+1, k+1)==pieza && t.getCasilla(i-1, k-1)==pieza)
						|| (t.getCasilla(i+1, k+1)==pieza && t.getCasilla(i+2, k+2)==pieza)
						|| (t.getCasilla(i-1, k-1)==pieza && t.getCasilla(i-2, k-2)==pieza)
						|| (t.getCasilla(i+1, k-1)==pieza && t.getCasilla(i-1, k+1)==pieza)
						|| (t.getCasilla(i+1, k-1)==pieza && t.getCasilla(i+2, k-2)==pieza)
						|| (t.getCasilla(i-1, k+1)==pieza && t.getCasilla(i-2, k+2)==pieza))
						b=true;
				}
			}
		return b;
	}

	public boolean esGanador(Jugador j){
		boolean b = false;
		Tablero t = getT();
		int pieza=j.getPieza();
		for (int i=0;i<3 && !b;i++)
			for (int k=0;k<3 && !b;k++)
				if (t.getCasilla(i, k)==pieza){
					if ((t.getCasilla(i+1, k)==pieza && t.getCasilla(i-1, k)==pieza)
						|| (t.getCasilla(i+1, k)==pieza && t.getCasilla(i+2, k)==pieza)
						|| (t.getCasilla(i-1, k)==pieza && t.getCasilla(i-2, k)==pieza)	
						|| (t.getCasilla(i, k+1)==pieza && t.getCasilla(i, k-1)==pieza)
						|| (t.getCasilla(i, k+1)==pieza && t.getCasilla(i, k+2)==pieza)
						|| (t.getCasilla(i, k-1)==pieza && t.getCasilla(i, k-2)==pieza)
						|| (t.getCasilla(i+1, k+1)==pieza && t.getCasilla(i-1, k-1)==pieza)
						|| (t.getCasilla(i+1, k+1)==pieza && t.getCasilla(i+2, k+2)==pieza)
						|| (t.getCasilla(i-1, k-1)==pieza && t.getCasilla(i-2, k-2)==pieza)
						|| (t.getCasilla(i+1, k-1)==pieza && t.getCasilla(i-1, k+1)==pieza)
						|| (t.getCasilla(i+1, k-1)==pieza && t.getCasilla(i+2, k-2)==pieza)
						|| (t.getCasilla(i-1, k+1)==pieza && t.getCasilla(i-2, k+2)==pieza))
						b=true;
				}
		return b;
	}
	
	@Override
	public String toString() {
		return "_________________________________\n" + "Tablero:\n" + t + "\nTurno=" + turno + "\nJugador 0: " + jugadores.get(0).getPieza() +
				"\nJugador 1: " + jugadores.get(1).getPieza() + "\n" +
				"_________________________________\n";
	}
	
	
}
